// 类（对象）（属性、方法）
// 熟悉class类语法、熟悉Promise语法、熟悉uniapp
interface HeaderType {
	[key:string]:string
}
interface DefaultConfigType {
	baseURL:string
	// header:Record<string,string> //方式1
	header:HeaderType  //方式2
}

//get调用的参数类型
interface RequestConfig {
	url:string
	method:'GET'|'POST'|'DELETE'|'PUT'
}

//请求结果数据包的类型
interface DataType {
	results:any
}
interface ResType {
	errMsg:string
	data:DataType
}

export default class HttpClient {
	default:DefaultConfigType = {  //1. 网络请求配置
		baseURL:'',
		header:{},
	} 
	constructor(config:DefaultConfigType){ //2. 实例化的时候，会自动执行
		this.default = {
			...config
		}
	}
	
	// 3. 发起网络请求的通用方法
	request(config:RequestConfig){
		//config提供的url会有两种情况？
		if(config.url&&!config.url.startsWith('http')){ //处理非http打头的url
			config.url = this.default.baseURL + config.url
		}
		return new Promise((resolve,reject)=>{
			uni.request({
				url:config.url,  //此处要确保url是http打头的完整地址
				method:config.method,
				header:{
					...this.default.header //拓展运算符
				},
				success: (res:UniApp.RequestSuccessCallbackResult) => {
					resolve(res)   //成功结果
				},
				fail: (err) => {
					reject(err)  //失败结果
				}
			})
		})
	}
	
	get(url:string){
		//4. 发起网络请求
		return this.request({url,method:'GET'})
	}
}




